package com.wgh.product.converter;

import com.wgh.product.dto.SkuDTO;
import com.wgh.product.dto.ProductDTO;
import com.wgh.product.dto.ProductSkuAttributeDTO;
import com.wgh.product.entity.shop.Sku;
import com.wgh.product.entity.shop.Product;
import com.wgh.product.entity.shop.ProductSkuAttribute;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Sku转换器
 * 用于Sku实体与SkuDTO之间的转换
 */
@Component
public class SkuConverter {

    /**
     * 将Sku实体转换为SkuDTO
     */
    public SkuDTO toDTO(Sku sku) {
        if (sku == null) {
            return null;
        }
        
        SkuDTO skuDTO = new SkuDTO();
        skuDTO.setId(sku.getId());
        skuDTO.setProductId(sku.getProductId());
        skuDTO.setSkuCode(sku.getSkuCode());
        skuDTO.setName(sku.getName());
        skuDTO.setSalePrice(sku.getSalePrice());
        skuDTO.setStock(sku.getStock());
        skuDTO.setWarningStock(sku.getWarningStock());
        skuDTO.setImage(sku.getImage());
        skuDTO.setAttributesJson(sku.getAttributesJson());
        skuDTO.setStatus(sku.getStatus());
        skuDTO.setCreateTime(sku.getCreateTime());
        skuDTO.setUpdateTime(sku.getUpdateTime());
        
        // 转换关联的商品信息
        if (sku.getProduct() != null) {
            ProductDTO productDTO = new ProductDTO();
            productDTO.setId(sku.getProduct().getId());
            productDTO.setName(sku.getProduct().getName());
            // 可以根据需要添加更多商品字段的转换
            skuDTO.setProduct(productDTO);
        }
        
        // 转换关联的SKU属性信息
        if (sku.getSkuAttributes() != null && !sku.getSkuAttributes().isEmpty()) {
            List<ProductSkuAttributeDTO> skuAttributeDTOs = sku.getSkuAttributes().stream()
                    .map(this::convertProductSkuAttributeToDTO)
                    .collect(Collectors.toList());
            skuDTO.setSkuAttributes(skuAttributeDTOs);
        }
        
        return skuDTO;
    }
    
    /**
     * 将SkuDTO转换为Sku实体
     */
    public Sku toEntity(SkuDTO skuDTO) {
        if (skuDTO == null) {
            return null;
        }
        
        Sku sku = new Sku();
        sku.setId(skuDTO.getId());
        sku.setProductId(skuDTO.getProductId());
        sku.setSkuCode(skuDTO.getSkuCode());
        sku.setName(skuDTO.getName());
        sku.setSalePrice(skuDTO.getSalePrice());
        sku.setStock(skuDTO.getStock());
        sku.setWarningStock(skuDTO.getWarningStock());
        sku.setImage(skuDTO.getImage());
        sku.setAttributesJson(skuDTO.getAttributesJson());
        sku.setStatus(skuDTO.getStatus());
        
        // 非数据库字段不需要设置
        
        return sku;
    }
    
    /**
     * 将Sku实体列表转换为SkuDTO列表
     */
    public List<SkuDTO> toDTOList(List<Sku> skus) {
        if (skus == null || skus.isEmpty()) {
            return null;
        }
        
        return skus.stream()
                .map(this::toDTO)
                .collect(Collectors.toList());
    }
    
    /**
     * 将SkuDTO列表转换为Sku实体列表
     */
    public List<Sku> toEntityList(List<SkuDTO> skuDTOs) {
        if (skuDTOs == null || skuDTOs.isEmpty()) {
            return null;
        }
        
        return skuDTOs.stream()
                .map(this::toEntity)
                .collect(Collectors.toList());
    }
    
    /**
     * 转换ProductSkuAttribute到ProductSkuAttributeDTO
     */
    private ProductSkuAttributeDTO convertProductSkuAttributeToDTO(ProductSkuAttribute skuAttribute) {
        if (skuAttribute == null) {
            return null;
        }
        
        ProductSkuAttributeDTO dto = new ProductSkuAttributeDTO();
        dto.setId(skuAttribute.getId());
        dto.setSkuId(skuAttribute.getSkuId());
        dto.setAttributeId(skuAttribute.getAttributeId());
        dto.setAttributeValueId(skuAttribute.getAttributeValueId());
        dto.setAttributeName(skuAttribute.getAttributeName());
        dto.setAttributeValueName(skuAttribute.getAttributeValueName());
        dto.setCreateTime(skuAttribute.getCreateTime());
        dto.setUpdateTime(skuAttribute.getUpdateTime());
        
        return dto;
    }
}